/*
 * @(#)Call.java $version 2010. 8. 11
 *
 * Copyright 2007-2010 NHN Corp. All rights Reserved. 
 * NHN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package com.nhncorp.usf.core.call;

import java.io.Serializable;
import java.util.List;

/**
 * 객체에 대한 메소드 호출을 표현한다. 호출은 다음 세 가지 요소로 구성된다.
 * <ul>
 * <li><tt>objectName</tt> - 호출 대상 객체의 이름</li>
 * <li><tt>methodName</tt> - 호출 대상 객체의 호출하고자 하는 메소드 이름</li>
 * <li><tt>parameters</tt> - 메소드 호출 시 전달한 파라메터들</li>
 * </ul>
 * 이 인터페이스는 실행 도중 의도되지 않은 프로퍼티 변경을 막기 위해 setter를 제공하지 않는다. {@link Call}의 프로퍼티를
 * 변경할 필요가 있을 경우 {@link MutableCall}을 사용한다.
 * 
 * @author Web Platform Development Team
 */
public interface Call extends Serializable {

	/**
	 * 호출 대상 객체의 이름을 리턴한다. 아직 설정되지 않았다면 <tt>null</tt>을 리턴할 수 있다.
	 * 
	 * @return 호출 대상의 객체 이름
	 */
	String getObjectName();

	/**
	 * 호출 대상 메소드의 이름을 리턴한다. 아직 설정되지 않았다면 <tt>null</tt>을 리턴할 수 있다.
	 * 
	 * @return 호출 대상의 메소드 이름
	 */
	String getMethodName();

	/**
	 * 호출 대상에게 넘겨줄 파라메터의 목록을 리턴한다. 이 메소드는 <tt>null</tt>을 리턴하지 않는다.
	 * 
	 * @return 호출 대상의 인자값을 받는다
	 */
	List<Object> getParameters();

	/**
	 * <tt>objectName</tt>과 <tt>methodName</tt> 프로퍼티가 제대로 설정되어 있는지 확인한다.<br>
	 * <b>IllegalStateException</b>발생 : 두 프로퍼티 중 하나라도 <tt>null</tt>일 경우 
	 */
	void validate();
}
